home *** CD-ROM | disk | FTP | other *** search
- /* A general-purpose exception-handling system for C *
- * by Jonathan Amsterdam, 1991 *
- * BYTE August 1991, p. 259 ff */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include "exhandle.h"
-
- /* Alert IDs */
-
- #ifdef DBOX
- #include <Dialogs.h>
- #define UNHANDLE 256
- #define EMPTYSTACK 257
- #define CORRUPTSTACK 258
- #endif
-
- except theException;
- jmp_buf_rec *cur_rec = NULL;
-
- void push_jbr (jbr)
- jmp_buf_rec *jbr;
- {
- jbr->next = cur_rec;
- jbr->self = jbr;
- cur_rec = jbr;
- }
-
- void pop_jbr ()
- {
- if (cur_rec == NULL) {
- #ifdef DBOX
- StopAlert (EMPTYSTACK, nil);
- #else
- fprintf (stderr, "Attempt to pop empty exception stack");
- fflush (stderr);
- #endif
- exit (1);
- } else {
- cur_rec = cur_rec->next;
- }
- }
-
- void exraise (ex)
- int ex;
- {
- jmp_buf_rec *jbr;
- #ifdef DBOX
- char buff[256];
- #ifdef CODERES
- static unsigned char *blank;
-
- blank = "\p";
- #else
- static unsigned char *blank = "\p";
- #endif
- #endif
-
- if (cur_rec == NULL) {
- #ifdef DBOX
- sprintf (buff, "%d", ex);
- ParamText (c2pstr (buff), blank, blank, blank);
- StopAlert (UNHANDLE, nil);
- #else
- fprintf (stderr, "Unhandled exception: %d", ex);
- fflush (stderr);
- #endif
- exit (2);
- } else {
- theException.code = ex;
- jbr = cur_rec;
- if (jbr->self != jbr) {
- #ifdef DBOX
- StopAlert (CORRUPTSTACK, nil);
- #else
- fprintf (stderr, "Corrupted exception stack");
- fflush (stderr);
- #endif
- exit (2);
- }
- pop_jbr ();
- longjmp (jbr->jb, 1);
- }
- }
-
- void exraisebuff (except *ex)
- {
- theException.buff = ex->buff;
- exraise (ex->code);
- }
-
- void reraise ()
- {
- exraisebuff (&theException);
- }